package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.ConfirmacaoDAO;
import br.com.duosoftware.orcamento.daos.GestorDAO;
import br.com.duosoftware.orcamento.daos.IngressoDAO;
import br.com.duosoftware.orcamento.daos.TipoCargoDAO;
import br.com.duosoftware.orcamento.daos.TipoServicoDAO;
import br.com.duosoftware.orcamento.entidades.Confirmacao;
import br.com.duosoftware.orcamento.entidades.Documento;
import br.com.duosoftware.orcamento.entidades.Gestor;
import br.com.duosoftware.orcamento.entidades.Ingresso;
import br.com.duosoftware.orcamento.entidades.TipoCargo;
import br.com.duosoftware.orcamento.entidades.TipoServico;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 *
 */
@ManagedBean
@ViewScoped
public class GestorBean implements Serializable {

    private Gestor gestor;
    private List<Gestor> gestores;
    private GestorDAO gestorDAO;
    //
    ///****Select Itens****
    //
    private List<SelectItem> ordenadores;
    private List<SelectItem> ingressos;
    private List<SelectItem> tiposServico;
    private List<SelectItem> tiposCargo;

    public GestorBean() {

        gestorDAO = new GestorDAO();

    }

    public Gestor getGestor() {
        return gestor;
    }

    public void setGestor(Gestor gestor) {
        this.gestor = gestor;
    }

    public List<Gestor> getGestores() {
        if (gestores == null) {
            gestores = gestorDAO.listarGestores();
        }
        return gestores;
    }

    public void setGestores(List<Gestor> gestores) {
        this.gestores = gestores;
    }

    /**
     * <b>Método que inicializa o Gestor a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        gestor = new Gestor();
        gestor.setDocumento(new Documento());
        

    }

    /**
     * <b>Método que adiciona ou edita um Gestor</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        gestorDAO.salvarOuAtualizar(gestor);
        gestor = new Gestor();
        gestores = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgGestor.hide()");
        requestContext.update("formGestores:dtGestores");

    }

    /**
     * <b>Método para iniciar o processo de edição de um Gestor.</b> <p>
     *
     * Ele verifica se há um Gestor selecionada para edição, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Gestor selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (gestor == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgGestor.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um Gestor.</b> <p>
     *
     * Ele verifica se há um Gestor selecionado para exclusão, se não houver é
     * emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um Gestor selecionado o médoto abre um p:dialog para confirma
     * ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (gestor == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirGestor.show()");
        }

    }

    /**
     * <b>Método para excluir um Gestor.</b> <p>
     *
     * Ele verifica se a Gestor selecionado para exclusão está sendo utilizado
     * por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
     * ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            gestorDAO.excluir(gestor);
            gestor = new Gestor();
            gestores = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirGestor.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável Gestor para limpar as
     * infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        gestor = new Gestor();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgGestor.hide()");
        requestContext.update("formGestores:dtGestores");

    }

    //get SelectItens
    //
    public List<SelectItem> getOrdenadores() {
        if (ordenadores == null) { //Nos casos em que os dados são FIXOS
            ordenadores = new LinkedList<SelectItem>();
            for (Confirmacao confirmacao : new ConfirmacaoDAO()
                    .listarConfirmacoes()) {
                ordenadores.add(new SelectItem(confirmacao, confirmacao.toString()));
            }
        }
        return ordenadores;
    }
    //
    public List<SelectItem> getIngressos() {
        if (ingressos == null) { //Nos casos em que os dados são FIXOS
            ingressos = new LinkedList<SelectItem>();
            for (Ingresso ingresso : new IngressoDAO()
                    .listarIngressos()) {
                ingressos.add(new SelectItem(ingresso, ingresso.toString()));
            }
        }
        return ingressos;
    }
    //
    public List<SelectItem> getTiposServico() {
        if (tiposServico == null) { //Nos casos em que os dados são FIXOS
            tiposServico = new LinkedList<SelectItem>();
            for (TipoServico tipoServico : new TipoServicoDAO()
                    .listarTipoServico()) {
                tiposServico.add(new SelectItem(tipoServico, tipoServico.toString()));
            }
        }
        return tiposServico;
    }
    //
    public List<SelectItem> getTiposCargo() {
        if (tiposCargo == null) { //Nos casos em que os dados são FIXOS
            tiposCargo = new LinkedList<SelectItem>();
            for (TipoCargo tipoCargo : new TipoCargoDAO()
                    .listarTiposCargo()) {
                tiposCargo.add(new SelectItem(tipoCargo, tipoCargo.toString()));
            }
        }
        return tiposCargo;
    }
}
